package com.feige.algorithm;

import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.hint.HintShardingValue;

import java.util.ArrayList;
import java.util.Collection;

public class CustomHintTableShardingAlgorithm implements HintShardingAlgorithm<Long> {
    /**
     * @param tableNames        数据源集合
     *                          在分库时值为所有分片库的集合 databaseNames
     *                          分表时为对应分片库中所有分片表的集合 tablesNames
     * @param hintShardingValue 分片属性，包括
     *                          logicTableName 为逻辑表，
     *                          columnName 分片健（字段），hit策略此处为空 ""
     *                          <p>
     *                          value 【之前】都是 从 SQL 中解析出的分片健的值,用于取模判断
     *                          HintShardingAlgorithm不再从SQL 解析中获取值，而是直接通过
     *                          hintManager.addTableShardingValue("product_order", 1)参数进行指定
     * @return
     */
    @Override
    public Collection<String> doSharding(Collection<String> tableNames,
                                         HintShardingValue<Long> hintShardingValue) {
        Collection<String> result = new ArrayList<>();
        for (String tableName : tableNames) {
            for (Long shardingValue : hintShardingValue.getValues()) {

//                if (tableName.endsWith(String.valueOf(shardingValue % tableNames.size()))) {
//                    result.add(tableName);
//                }
                // 指定数据表
//                if (tableName.endsWith(String.valueOf(shardingValue))) {
//                    result.add(tableName);
//                }
                // 查询某个库下所有的分表
                for (long i = 0; i < shardingValue; i++) {
                    if (tableName.endsWith(String.valueOf(i % tableNames.size()))) {
                        result.add(tableName);
                    }
                }
            }
        }
        return result;
    }
}